package com.itlong.cloud.app.service;

import com.itlong.cloud.POJO.DTO.app.AppDeviceOrderDTO;
import com.itlong.cloud.POJO.DTO.app.CreateDeviceMarkDTO;
import com.itlong.cloud.POJO.VO.app.*;
import com.itlong.cloud.POJO.VO.property.AppCloudElevatorRunState;
import com.itlong.cloud.POJO.VO.property.CloudElevatorVO;
import com.itlong.cloud.POJO.VO.property.MiniCloudElevatorRunStateVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * <desc>
 *      App设备信息业务处理接口
 * </desc>
 *
 * @createDate 2017/10/23
 */
public interface IAppDeviceService {

    /**
     * <desc>
     *      获取用户设备信息
     * </desc>
     *
     * @param userId 用户id
     * @param projectIds 项目id
     * @return
     * @author Jiaqi.X
     * @createDate 2017/11/08
     */
    public List<AppGetUserDevicesListVO> getUserDevicesList(String userId,String projectIds) throws Exception;

    /**
     * <desc>
     *      获取用户门禁设备列表
     * </desc>
     *
     * @param userId 用户Id
     * @param projectId 项目Id
     * @param updateCache 是否更新缓存 1是 0否
     * @return
     * @author Jiaqi.X
     * @createDate 2017/10/23
     */
    List<AppDoorDevicesVO> getDoorDevices(String userId,String projectId,Integer updateCache) throws Exception;

    /**
     * <desc>
     *      查询蓝牙外呼设备
     * </desc>
     *
     * @param deviceUniques
     * @return
     * @author Jiaqi.X
     * @createDate 2020/04/17
     */
    List<AppOutCallDevicesVO> getOutCallDevices(Set<String> deviceUniques,String cardNum);

    /**
     * <desc>
     *      获取用户门禁设备列表
     * </desc>
     *
     * @param userId 用户Id
     * @param projectId 项目Id
     * @param updateCache 是否更新缓存 1是 0否
     * @return
     * @author Jiaqi.X
     * @createDate 2017/10/23
     */
    public List<AppDoorDevicesVO> getTempDoorDevices(String userId,String projectId,Integer updateCache) throws Exception;

    /**
     * <desc>
     *      获取用户电梯设备列表
     * </desc>
     *
     * @param userId 用户Id
     * @param projectId 项目Id
     * @param updateCache 是否更新缓存 1是 0否
     * @return
     * @author Jiaqi.X
     * @createDate 2017/10/23
     */
    List<AppFloorDevicesVO> getFloorDevices(String userId,String projectId,Integer updateCache);

    /**
     * <desc>
     *      获取用户电梯设备列表
     * </desc>
     *
     * @param userId 用户Id
     * @param projectId 项目Id
     * @param updateCache 是否更新缓存 1是 0否
     * @return
     * @author Jiaqi.X
     * @createDate 2017/10/23
     */
    List<AppFloorDevicesVO> getTempFloorDevices(String userId, String projectId,Integer updateCache);

    /**
     * <desc>
     *      获取用户电梯设备列表 仅供用于合景泰富非标查询（需查出用户所拥有权限楼层所对应房间的正背门信息）
     * </desc>
     *
     * @param userId 用户Id
     * @param projectId 项目Id
     * @param updateCache 是否更新缓存 1是 0否
     * @return
     * @author Juguang.S
     * @createDate 2021/03/10
     */
    List<AppFloorDevicesVO> getFloorDevicesByNoStardard(String userId,String projectId,Integer updateCache);

    /**
     * <desc>
     *      获取用户电梯设备列表
     * </desc>
     *
     * @param userId 用户Id
     * @param projectId 项目Id
     * @param updateCache 是否更新缓存 1是 0否
     * @return
     * @author Jiaqi.X
     * @createDate 2017/10/23
     */
    List<AppFloorDevicesVO> getFloorDevicesForPad(String userId, String projectId,Integer updateCache,Integer arrearsType);

    /**
     * <desc>
     *      获取用户云对讲设备列表
     * </desc>
     *
     * @param userId 用户Id
     * @param projectId 项目Id
     * @param updateCache 是否更新缓存 1是 0否
     * @return
     * @author Jiaqi.X
     * @createDate 2017/10/23
     */
    List<AppCloudIntercomsVO> getCloudIntercoms(String userId,String projectId,Integer updateCache) throws Exception;

    /**
     * <desc>
     *      获取用户云对讲设备列表
     * </desc>
     *
     * @param userId 用户Id
     * @param projectId 项目Id
     * @param updateCache 是否更新缓存 1是 0否 3云对讲推送业务获取云对讲设备
     * @return
     * @author Jiaqi.X
     * @createDate 2017/10/23
     */
    List<AppCloudIntercomsVO> getTempCloudIntercoms( String userId,String projectId,Integer updateCache) throws Exception;

    /**
     * <desc>
     *      根据用户查询云对讲设备房间
     * </desc>
     *
     * @param userId 用户Id
     * @param projectId 项目Id
     * @param deviceUnique 设备编号
     * @return
     * @author Qiang.S
     * @createDate 2019/06/10
     */
    String getCloudIntercomRoomInfo(String userId,String projectId,String deviceUnique) throws Exception;

    /**
     * <desc>
     *      更新设备排序值
     * <desc/>
     *
     * @param userId 用户id
     * @param projectId 项目id
     * @param orderDTOS 设备排序列表
     * @return
     * @author Chunjian.G
     * @createDate 2017-11-08
     */
    Integer updateDeviceOrders(String userId, String projectId, List<AppDeviceOrderDTO> orderDTOS) throws Exception;

    /**
     * <desc>
     *      更新用户设备列表缓存信息
     * </desc>
     *
     * @param projectId 项目id
     * @param userId 用户id
     * @param dataJs 需要推送的信息
     * @param userIdList 需要推送的用户list集合
     * @author Jiaqi.X
     * @createDate 2017/11/13
     */
    void updateUserDevicesInfoCache(String projectId,String userId,String dataJs,String userIdList) throws Exception;

    /**
     * <desc>
     *      设置app用户二维码信息
     * </desc>
     *
     * @param userId 用户id
     * @param projectId 项目id
     * @return
     * @author Jiaqi.X
     * @createDate 2017/11/15
     */
    void setUserQrCode(String userId,String projectId,String roomId) throws Exception;

    /**
     * <desc>
     *      获取用户无接触二维码
     * </desc>
     *
     * @param userId 用户编号
     * @param deviceUnique 设备编号
     * @param logicalFloor 楼层
     * @return
     * @author Qiang.S
     * @createDate 2020/02/28
     */
    String getNoTouchQRCode(String userId,String deviceUnique,String logicalFloor) throws Exception;

    /**
     * <desc>
     *      推送云对讲设备端拉取业主认证增量信息
     * </desc>
     *
     * @param projectId 项目id
     * @param userId    用户id
     * @param commandType 业务指令
     * @return
     * @author Jiaqi.X
     * @createDate 2017/11/23
     */
    Integer pushCloudDeviceAuth(String projectId, String userId,Integer commandType) throws Exception;


    /**
     * <desc>
     *      获取授权二维码
     * </desc>
     *
     * @param projectId 项目id
     * @param tlv 仅二维码SDK调用时传
     * @return
     * @author Jiaqi.X
     * @createDate 2017/12/13
     */
    public String getAuthQrcode(String projectId,String tlv) throws Exception;

    /**
     * <desc>
     *      获取项目云对讲启用状态
     * </desc>
     *
     * @param projectId
     * @return
     */
    String getProjectIsSmartCommunity(String projectId);

    /**
     * <desc>
     *      获取电梯实时状态
     * </desc>
     *
     * @param deviceUnique 设备序列号 多个,号分隔
     * @param userId
     * @return
     * @author Jiaqi.X
     * @createDate 2018/04/10
     */
    List<AppCloudElevatorRunState> getCloudElevatorState(String deviceUnique,String userId) throws Exception;

    /**
     * <desc>
     *      获取电梯实时状态(小程序)
     * </desc>
     *
     * @param deviceUnique 设备序列号 多个,号分隔
     * @param userId
     * @return
     * @author Jiaqi.X
     * @createDate 2018/11/29
     */
    List<MiniCloudElevatorRunStateVO> getCloudElevatorStateForMini(String deviceUnique,String userId, String requestId) throws Exception;

    /**
     * <desc>
     *      预约呼梯
     * </desc>
     *
     * @param deviceUnique 设备序列号
     * @param sourceFrom 来源 （app传itlong）
     * @param startingFloor 起始楼层（真实楼层）
     * @param gotoFloor 目的楼层（真实楼层）
     * @param floor 呼梯楼层（真实楼层）多个，号分隔
     * @param callType 呼梯类型 对应枚举类 CloudElevatorCallTypeEnum
     * @param snr 呼梯流水号
     * @param ctrElevator 强制控梯 1是 0 否
     * @return
     * @author Jiaqi.X
     * @createDate 2018/04/12
     */
    Boolean cloudElevatorCall(String deviceUnique,String sourceFrom,String startingFloor,
                              String gotoFloor,String floor,Integer callType,Integer seconds,
                              Integer callSource,String robotId,String snr,Integer ctrElevator, Integer isAPI, String upDown, String userId, String requestId);

    /**
     * <desc>
     *      开放或自动登记楼层
     * </desc>
     *
     * @param deviceUnique 设备序列号
     * @param sourceFrom 来源 （app传itlong）
     * @param floor 呼梯楼层（真实楼层）多个，号分隔
     * @param callType 呼梯类型 对应枚举类 CloudElevatorCallTypeEnum
     * @param seconds 秒
     * @return
     * @author Jiaqi.X
     * @createDate 2018/04/12
     */
    Boolean openOrAutoRegister(String deviceUnique,String sourceFrom,String floor,Integer callType,Integer seconds,Integer callSource, String isRobot, String userId);

    /**
     * <desc>
     *      设置云电梯专梯模式
     * </desc>
     *
     * @param deviceUnique
     * @author Jiaqi.X
     * @createDate 2019/01/22
     */
    void setCloudElevatorSpecialUseModel(String deviceUnique,String model) throws Exception;

    /**
     * <desc>
     *      获取呼梯需要的云电梯信息
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @aurhor Jiaqi.X
     */
    CloudElevatorVO getCallElevatorInfo(String deviceUnique);

    /**
     * <desc>
     *      根据设备唯一码获取门禁类型
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jugaung.S
     * @createDate 2019/05/26
     */
    Integer getEntranceTypeInfo(String deviceUnique);

    /**
     * <desc>
     *      用户读取欠费消息
     * </desc>
     *
     * @return 欠费消息
     * @author wangzhi
     * @createDate 2019/05/28
     */
    Map<String,String> getArrearageInfo(String projectId, String roomId, String deviceUnique, String userId, String type, String deviceType) throws Exception;

    /**
     * <desc>
     *     根据设备序列号查询绑定控制器
     * </desc>
     *
     * @param elevatorDeviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2019/04/28
     */
    Map<String,Object> getControllerDeviceUniqueByElevatorDeviceUnique(String elevatorDeviceUnique);

    /**
     * <desc>
     *     更新个人设备排序值
     * </desc>
     *
     * @param userId 用户编号
     * @param projectId 项目编号
     * @param deviceUniques 设备编号逗号分隔
     * @return
     * @author Qiang.S
     * @createDate 2019/08/07
     */
    Integer uploadDeviceOrder(String userId,String projectId,String deviceUniques, String deviceType);

    /**
     * <desc>
     *     获取个人设备排序信息
     * </desc>
     *
     * @param userId 用户编号
     * @param projectId 项目编号
     * @return
     * @author Qiang.S
     * @createDate 2019/08/07
     */
    String getUserDeviceOrder(String userId,String projectId);

    /**
     * <desc>
     *      获取个人电梯设备排序信息
     * </desc>
     *
     * @param userId    用户编号
     * @param projectId 项目编号
     * @return 个人电梯设备排序信息
     * @author wangzhi
     * @createDate 2019/10/09
     */
    String getUserElevatorOrder(String userId, String projectId);

    /**
     * <desc>
     *      获取用户常用楼层
     * </desc>
     *
     * @param userId    用户编号
     * @param projectId 项目编号
     * @return 用户常用楼层
     * @author wangzhi
     * @createDate 2019/10/11
     */
    String getUserCommonFloor(String userId, String projectId) throws Exception;

    /**
     * <desc>
     *      获取用户常用公共楼层
     * </desc>
     *
     * @param userId 用户编号
     * @param projectId 项目编号
     * @return 用户常用公共楼层
     * @author pengwei
     * @createDate 2020-11-13
     */
    String getUserPublicFloor(String userId, String projectId) throws Exception;

    /**
     * <desc>
     *      根据楼层名称获取实际楼层和权限标识
     * </desc>
     *
     * @param floors
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2019/08/15
     */
    Map<String,Object> getFloorNumAndNaturalFloorByLogicFloor(String floors,String deviceUnique);

    /**
     * <desc>
     *      获取当前用户的临时权限
     * </desc>
     *
     * @param userId 用户Id
     * @param projectId 项目Id
     * @return
     * @author Juguang.S
     * @createDate 2019/09/02
     */
    List<AppUserDevicesVO> getUserDevicesInfo(String userId, String projectId) throws Exception;

    /**
     * <desc>
     *      保存或修改访客的设备标签
     * </desc>
     *
     * @param deviceMarkDTO 创建或修改标签的信息
     * @return
     * @author Juguang.S
     * @createDate 2019/09/02
     */
    String saveOrUpdateDeviceMark(CreateDeviceMarkDTO deviceMarkDTO) throws Exception;

    /**
     * <desc>
     *      获取当前用户的设备标签
     * </desc>
     *
     * @param userId 用户编号
     * @param projectId 项目编号
     * @return
     * @author Juguang.S
     * @createDate 2019/09/02
     */
    List<VisitorDeviceMarkInfoVO> getDeviceMark(String userId, String projectId) throws Exception;

    /**
     * <desc>
     *      删除设备标签
     * </desc>
     *
     * @param markId 标签ID
     * @return
     * @author Juguang.S
     * @createDate 2019/09/03
     */
    Integer deleteDeviceMark(String markId) throws Exception;

    /**
     * <desc>
     *      根据房间编号和项目编号获取房间下的业主编号
     * </desc>
     *
     * @param roomId 房间ID
     * @param projectId 项目ID
     * @return
     * @author Juguang.S
     * @createDate 2019/09/03
     */
    String getOwnerUserIdByroomId(String roomId,String projectId) throws Exception;

    /**
     * <desc>
     *      获取当前用户的临时电梯设备列表
     * </desc>
     *
     * @param userId 用户Id
     * @param projectId 项目Id
     * @return
     * @author Juguang.S
     * @createDate 2019/09/04
     */
    List<AppFloorDevicesVO> getUserTemporaryAuthFloorDevices(String userId, String projectId);

    /**
     * <desc>
     *      获取项目的云服务费最小过期时间
     * </desc>
     *
     * @param projectId 项目Id
     * @return 项目的云服务费最小过期时间
     * @author wangzhi
     * @createDate 2020/02/26
     */
    String getProjectCloudServiceCostMinEndTime(String projectId) throws Exception;

    /**
     * <desc>
     *      获取游客模式下有公共楼层的电梯设备
     * </desc>
     *
     * @param projectId 项目Id
     * @return 游客模式下有公共楼层的电梯设备
     * @author wangzhi
     * @createDate 2020/05/06
     */
    List<AppFloorDevicesVO> getGuestFloorList(String projectId) throws Exception;

    /**
     * <desc>
     *      获取个人电梯、群控器设备排序信息
     * </desc>
     *
     * @param userId    用户编号
     * @param projectId 项目编号
     * @return 个人电梯、群控器设备排序信息
     * @author wangzhi
     * @createDate 2020/05/07
     */
    String getUserElevatorControllerOrder(String userId, String projectId) throws Exception;

    /**
     * <desc>
     *      用户是否是vip
     * <desc/>
     *
     * @param userId 用户编号
     * @param projectId 项目编号
     * @return
     * @author pengwei
     * @createDate 2020-11-13
     */
    boolean appUserIsVip(String userId, String projectId) throws Exception;


    /**
     * <desc>
     * 获取公共楼层和常用楼层
     * </desc>
     *
     * @param projectId 项目编号
     * @Author chengshican
     * @Date 2020-11-19 16:32
     * @Param userId 用户编号
     * @Return
     * @Exception
     */
    Map<String, Object> getAppCommonAndPublicByUserId(String userId, String projectId) throws Exception;

    /**
     * <desc>
     * 是否vip预约呼梯中
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author caoshuai
     * @createDate 2020/12/27 14:43
     */
    Boolean getIsVipCall(String deviceUnique);


    /**
     * <desc>
     * 通过门禁设备机号查询门禁所在地址
     * </desc>
     *
     * @author: chengshican
     *  @Date: 2021-01-04 12:11
     *
     */
    List<Map> getDeviceEntranceBridgeInfoByDeviceUnique( String deviceUnique);

    
    /**
    *<desc>
    * 通过平板设备机号查询所在地址
    *</desc>
    *
    * @Author  chengshican
    * @Date   2021-01-28 10:35
    * @Param  deviceUnique
    * @Return      
    * @Exception   
    * 
    */
    List<Map> getPadBridgeInfoByDeviceUnique(String deviceUnique);
    /**
     * <desc>
     * 获取用户标签
     * </desc>
     *
     * @param userId
     * @return
     * @author caoshuai
     * @createDate 2021/1/4 17:18
     */
    String getUserLabel(String userId, String projectId);

    /**
     * <desc>
     * 预约呼梯仅供于前海嘉里非标项目调用
     * </desc>
     *
     * @param deviceUnique  设备序列号
     * @param startingFloor 起始楼层（真实楼层）
     * @param gotoFloor     目的楼层（真实楼层）
     * @return
     * @author Juguang.S
     * @createDate 2020-03-11
     */
    Map<String,String> cloudElevatorCallByNonStandard(String deviceUnique,String startingFloor, String gotoFloor,String userId) throws Exception;
}
